// getKeyValueStr: 将对象的键值对用 '='和'&' 拼接成字符串
Object.prototype.getKeyValueStr = function() {
  return Object.keys(this).map(key => `${key}=${this[key]}`).join('&')
}

// 判断两个值是否相等, 针对 +0 === -0 返回 true，NaN === NaN 返回 false 的情况
// 这样定义相当于是 Object 构造函数的类方法
Object.is = function(x, y) {
  if (x === y) {
    // 1/+0 = +Infinity， 1/-0 = -Infinity, 是不一样的，0 和 +0 视为同一个数
    return x !== 0 || 1 / x === 1 / y;
  } else {
    // NaN===NaN是false,这是不对的，我们在这里做一个拦截，x !== x，那么一定是 NaN, y 同理
    // 两个都是NaN的时候返回true
    return x !== x && y !== y;
  }
}

// 判断某个属性是否为某个对象的原型属性而非实例属性
Object.isPrototypeProp = function(obj, key) {
  return key in obj && !obj.hasOwnProperty(key);
}